package fanxing;

public class Test {

	public static void main(String[] args) {
		Box<Integer> boxInt = new Box<Integer>(100);
		Box<String> boxStr = new Box<String>("hello");
		System.out.println(boxInt.getData());
		System.out.println(boxStr.getData());
		
		
		Box<Number> boxNum = new Box<Number>(500);
		getNumber(boxNum);
//		getNumber(boxInt); 报错，因为并不能把Box<Integer>当做Box<Number> 的子类
		
		getData(boxNum);
		getData(boxInt);
		
		getUpperNumberData(boxNum);
		getUpperNumberData(boxInt);
//		getUpperNumberData(boxStr); 报错， String并不是Number的子类
	}
	
	/** 不能把Box<Number>当做Box<Integer> 的父类
	 * @param data
	 */
	public static void getNumber(Box<Number> data){
        System.out.println("number :" + data.getData());
    }
	
	/** ? 为类型通配符，可以把Box<?> 当做Box<Number>、Box<Integer>、Box<String> 的父类
	 * @param data
	 */
	public static void getData(Box<?> data){
        System.out.println("data :" + data.getData());
    }

	/** 类型通配符上限通过形如Box<? extends Number>形式定义，相对应的，类型通配符下限为Box<? super Number>形式，其含义与类型通配符上限正好相反
	 * @param data
	 */
	public static void getUpperNumberData(Box<? extends Number> data){
        System.out.println("upper number, data :" + data.getData());
    }
}
